import router from '@/router'
import { useUserStore } from '@/stores/user'
import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例 - 籍祥供应链系统HTTP客户端
const http = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 使用环境变量
  timeout: 50000, // 请求超时时间(50秒)

  // 请求配置
  withCredentials: false, // 跨域请求时是否需要使用凭证
  xsrfCookieName: 'XSRF-TOKEN', // CSRF token的cookie名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // CSRF token的请求头名称

  // 请求头默认配置
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest' // 标识Ajax请求
  },

  // 响应数据类型
  responseType: 'json', // 默认响应格式

  // 请求数据转换
  transformRequest: [
    function (data) {
      // 对请求数据进行转换处理
      return JSON.stringify(data)
    }
  ],

  // 响应数据转换
  transformResponse: [
    function (data) {
      // 对响应数据进行预处理
      if (typeof data === 'string') {
        try {
          data = JSON.parse(data)
        } catch (e) {
          console.error('响应数据解析失败:', e)
        }
      }
      return data
    }
  ],

  // 最大重定向次数
  maxRedirects: 5,

  // 最大内容长度
  maxContentLength: 2000000, // 2MB

  // 响应状态码验证
  validateStatus: function (status) {
    return status >= 200 && status < 500 // 解决3xx重定向问题
  }
})

// 请求拦截器 - 在发送请求前添加token等处理
http.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()

    // 添加token到请求头
    if (userStore.userInfo?.token) {
      config.headers.jx_supply_chain_admin = userStore.userInfo.token
    }

    // 开发环境打印请求日志
    if (import.meta.env.DEV) {
      console.log(`🚀 发送请求: ${config.method?.toUpperCase()} ${config.url}`, config)
    }

    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器 - 统一处理响应数据和错误
http.interceptors.response.use(
  (response) => {
    const res = response.data

    // 401 token失效处理
    if (res.code === 401) {
      ElMessage({
        showClose: true,
        message: '登录失效，请重新登录',
        type: 'error',
      })
      const userStore = useUserStore()
      userStore.clearUserInfo()
      router.push('/login')
      return Promise.reject(new Error('登录失效'))
    }
    // 业务逻辑错误处理
    else if (res.code !== 200) {
      ElMessage({
        showClose: true,
        message: res.errorMessage || '请求失败',
        type: 'error',
      })
      return Promise.reject(new Error(res.errorMessage || '请求失败'))
    }

    // 请求成功，返回业务数据
    return res
  },
  (error) => {
    // 网络错误处理（后端有异常拦截，这里只处理网络层面错误）
    if (error.code === 'ECONNABORTED') {
      ElMessage({
        showClose: true,
        message: '请求超时，请检查网络连接',
        type: 'error',
      })
    } else {
      ElMessage({
        showClose: true,
        message: '系统异常，请联系管理员',
        type: 'error',
      })
    }

    return Promise.reject(error)
  }
)

export default http
